package com.sansi.pencilbook.DO;

import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonRawValue;
import com.sansi.pencilbook.Exception.BaseException;
import com.sansi.pencilbook.Enum.Status;
import org.apache.commons.lang.StringUtils;

public class ResponseDO {

    @JsonProperty
    private boolean success;
    @JsonProperty
    private String msg;
    @JsonProperty
    private int errorCode;
    @JsonProperty
    private Object data;

    public ResponseDO(){

    }

    public ResponseDO(boolean success, String msg, int errorCode, Object data){
        this.success = success;
        this.msg = msg;
        this.errorCode = errorCode;
        this.data = data;
    }

    /**
     * 构造一个自定义的API返回
     * @param success   是否成功
     * @param msg       返回内容
     * @param errorCode 状态码
     * @param data      返回数据
     * @return ResponseDO
     */
    public static ResponseDO of(boolean success, String msg, int errorCode, Object data){
        return new ResponseDO(success, msg, errorCode, data);
    }

    /**
     * 构造一个成功且带数据的API返回
     * @param data 返回数据
     * @return ResponseDO
     */
    public static ResponseDO ofSuccess(Object data){
        return ofStatus(Status.OK, data);
    }

    /**
     * 构造一个成功且自定义内容的API返回
     * @param message 返回内容
     * @return ResponseDO
     */
    public static ResponseDO ofSuccess(String message){
        return of(true, message, Status.OK.getCode(), null);
    }

    /**
     * 构造一个异常且带数据的API返回
     * @param t     异常
     * @param data  返回数据
     * @param <T>   BaseException的子类
     * @return ResponseDO
     */
    public static <T extends BaseException> ResponseDO ofException(T t, Object data){
        return of(false, t.getMessage(), t.getCode(), data);
    }

    /**
     * 构造一个异常且自定义内容的API返回
     * @param t         异常
     * @param message   自定义内容
     * @param <T>       BaseException的子类
     * @return ResponseDO
     */
    public static <T extends BaseException> ResponseDO ofException(T t, String message){
        return of(false, message, t.getCode(), null);
    }

    /**
     * 构造一个异常的API返回
     * @param t     异常
     * @param <T>   BaseException的子类
     * @return ResponseDO
     */
    public static <T extends BaseException> ResponseDO ofException(T t){
        return of(false, t.getMessage(), t.getCode(), null);
    }

    /**
     * 构造一个状态的API返回
     * @param status 状态
     * @return ResponseDO
     */
    public static ResponseDO ofStatus(Status status){
        return StringUtils.equals(status.getCode().toString(),"200") ?
            of(true, status.getMessage(), status.getCode(), null) :
            of(false, status.getMessage(), status.getCode(), null);
    }

    /**
     * 构造一个状态且带数据的API返回
     * @param status 状态
     * @param data 返回内容
     * @return ResponseDO
     */
    public static ResponseDO ofStatus(Status status, Object data){
        return StringUtils.equals(status.getCode().toString(),"200") ?
            of(true, status.getMessage(), status.getCode(), data) :
            of(false, status.getMessage(), status.getCode(), data);
    }
}